home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / Xconq 7.0d37 / source / kernel / mplay.h < prev    next >
Text File  |  1995-02-02  |  10KB  |  224 lines

  1. /* All the definitions needed by the mplayer AI.
  2.    Copyright (C) 1987, 88, 89, 91, 92, 93, 1994 Stanley T. Shebs.
  3.  
  4. Xconq is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2, or (at your option)
  7. any later version.  See the file COPYING.  */
  8.  
  9. #define MAXGOALS 10
  10.  
  11. /* Limit on the number of theaters a single side may have. */
  12.  
  13. #define MAXTHEATERS 98
  14.  
  15. /* Strategy is what a side uses to make decisions. */
  16.  
  17. typedef struct a_strategy {
  18.     int type;  /* placeholder */
  19.     int trytowin;
  20.     int creationdate;
  21.     short strengths[MAXSIDES][MAXUTYPES];  /* estimated numbers of units */
  22.     short points[MAXSIDES];  /* estimated point value */
  23.     short alstrengths[MAXSIDES][MAXUTYPES];  /* numbers in alliances */
  24.     short alpoints[MAXSIDES];  /* points in alliances */
  25.     short contacted[MAXSIDES+1];
  26.     short homefound[MAXSIDES+1];
  27.     int analyzegame;
  28.     struct a_theater *theaters;
  29.     struct a_theater **theatertable;
  30.     short numtheaters;
  31.     char *areatheaters;
  32.     struct a_theater *homefront;
  33.     struct a_theater *perimeters[NUMDIRS];
  34.     struct a_theater *midranges[NUMDIRS];
  35.     struct a_theater *remotes[NUMDIRS];
  36.     int numgoals;
  37.     struct a_goal *goals[MAXGOALS];
  38.     /* Exploration and search slots. */
  39.     int zonewidth, zoneheight;
  40.     int numzonex, numzoney;     /* dimensions of search zone array */
  41.     int numzones;
  42.     struct a_searchzone *searchzones;
  43.     short *explorertypes;
  44.     short explorersneeded;
  45.     short *terrainguess;
  46.     short cx, cy;               /* "centroid" of all our units */
  47.     short *demand;              /* worth of each utype w.r.t. strategy */
  48.     int explore_priority;
  49.     int defend_priority;
  50.     int attack_priority;
  51.     struct a_unit *unitlist[MAXUTYPES];   /* lists to help mplay efficiency */
  52.     short unitlistcount[MAXUTYPES];  /* counts of above lists */
  53.     short *actualmix;
  54.     short *expectedmix;
  55.     short *idealmix;
  56. } Strategy;
  57.  
  58. #define mplayer(s) ((Strategy *) (s)->ai)
  59.  
  60. extern int delaymove;
  61.  
  62. /* A Theater is a sub-area that can be planned for all at once. */
  63.  
  64. /* To save space in theater layer, no more than 127 theaters may exist at once.
  65.    This should be sufficient, even a Napoleon would have trouble keeping track
  66.    of that much activity. */
  67.  
  68. typedef struct a_theater {
  69.     short id;
  70.     char *name;             /* an informative name for this theater */
  71.     short x, y;             /* center of the theater */
  72.     short xmin, ymin;       /*  */
  73.     short xmax, ymax;       /*  */
  74.     long size;            /* number of cells in the theater */
  75.     short importance;       /* 0 = shrug, 100 = critical */
  76.     Goal *maingoal;
  77.     short allied_units;     /* How many units on our side here. */
  78.     short makers;           /* Total number of makers */
  79.     short unexplored;       /* Number of unseem cells in theater. */
  80.     short allied_bases;     /* Total number of our bases, includes towns */
  81.     short border;           /* True if this is a border theater. */
  82.     short nearby;           /* Is this close to a location we have bases. */
  83.     short reinforce;         /* Priority on request for units. */
  84.     short numassigned[MAXUTYPES]; /* num of each type assigned to theater */
  85.     short numneeded[MAXUTYPES];  /* units we should move to theater. */
  86.     short numtotransport[MAXUTYPES]; /* types needing transportation. */
  87.     short numenemies[MAXUTYPES];
  88.     short numsuspected[MAXUTYPES];
  89.     short numsuspectedmax[MAXUTYPES];
  90.     long *people;           /* number of populated cells seen */
  91.     int enemystrengthmin;   /* Estimate of enemy unit strength */
  92.     int enemystrengthmax;   /* Estimate of enemy unit strength */
  93.     short units_lost;       /* How many units have we lost here. */
  94.     /* Weighted average of last few turns. */
  95.     short capturers_approaching; /* number of units comming to capture bases */
  96.     short capture_time;     /* When do we expect to have capturers here */
  97.     short safe_area;        /* do we really need to move units here */
  98.     struct a_theater *next;
  99. } Theater;
  100.  
  101. #define for_all_theaters(s,th)  \
  102.   for ((th) = mplayer(s)->theaters; (th) != NULL; (th) = (th)->next)
  103.  
  104. /* values for unit_request */
  105. #define NO_UNITS 0
  106. #define GUARD_BASE 1
  107. #define PATROL_OPAREA 2
  108. #define EXPLORE_OPAREA 3
  109. #define DEFEND_OPAREA 4
  110. #define GUARD_TOWN 6
  111. #define GUARD_BORDER 2
  112. #define GUARD_BORDER_TOWN 10
  113. #define DEFEND_BASE 20
  114. #define DEFEND_TOWN 50
  115.  
  116. /* Var and fn decls. */
  117.  
  118. extern int worths_known;
  119.  
  120. /* General collections of numbers used by all machine players. */
  121.  
  122. /* Some basic ranges for prioritizing a units tasks. */
  123. #define EXPLORE_VAL 2500
  124. #define FAVORABLE_COMBAT 5000
  125. #define UNFAVORABLE_COMBAT 4000
  126. #define CAPTURE_MAKER 50000
  127. #define CAPTURE_OTHER 20000
  128. #define PATROL_VAL 100
  129. #define HEAD_FOR_GOAL 2300
  130. #define MEET_TRANSPORT 3000
  131.  
  132. extern int base_building;             /* true if base building is possible. */
  133.  
  134. extern int route_max_distance;
  135.  
  136. #define theater_at(s,x,y)  \
  137.   (mplayer(s)->theatertable[mplayer(s)->areatheaters[(x)+area.width*(y)]])
  138.  
  139. #define set_theater_at(s,x,y,th)  \
  140.   ((mplayer(s)->areatheaters[(x)+area.width*(y)]) = (th)->id)
  141.  
  142. #define for_all_cells_in_theater(s,x,y,th)  \
  143.   for ((x) = theater->xmin; (x) < theater->xmax; ++(x))  \
  144.     for ((y) = theater->ymin; (y) < theater->ymax; ++(y))  \
  145.       if (theater_at((s), (x), (y)) == (th)
  146.  
  147. extern void mplayer_init PROTO ((Side *side));
  148. extern void mplayer_init_turn PROTO ((Side *side));
  149. extern void create_strategy PROTO ((Side *side));
  150. extern void reset_strategy PROTO ((Side *side));
  151. extern void analyze_the_game PROTO ((Side *side));
  152. extern void determine_subgoals PROTO ((Side *side));
  153. extern void review_theaters PROTO ((Side *side));
  154. extern int fn_set_theater PROTO ((int x, int y));
  155. extern void create_initial_theaters PROTO ((Side *side));
  156. extern Theater *create_theater PROTO ((Side *side));
  157. extern void review_goals PROTO ((Side *side));
  158. extern void review_units PROTO ((Side *side));
  159. extern void update_side_strategy PROTO ((Side *side));
  160. extern void decide_theater_needs PROTO ((Side *side, Theater *theater));
  161. extern void update_unit_plans PROTO ((Side *side));
  162. extern void update_unit_plans_randomly PROTO ((Side *side));
  163. extern void decide_resignation PROTO ((Side *side));
  164. extern void give_up PROTO ((Side *side));
  165. extern void make_estimates PROTO ((Side *side));
  166. extern void add_goal PROTO ((Side *side, Goal *goal));
  167. extern Goal *has_goal PROTO ((Side *side, GoalType goaltype));
  168. extern void mplayer_decide_plan PROTO ((Side *side, Unit *unit));
  169. extern int need_this_type_to_explore PROTO ((Side *side, int u));
  170. /* extern int compare_weights PROTO ((struct weightelt *w1, struct weightelt *w2)); */
  171. extern void assign_to_exploration PROTO ((Side *side, Unit *unit));
  172. extern void assign_explorer_to_theater PROTO ((Side *side, Unit *unit, Theater *theater));
  173. extern int need_this_type_to_build_explorers PROTO ((Side *side, int u));
  174. extern void assign_to_explorer_construction PROTO ((Side *side, Unit *unit));
  175. extern void assign_to_offense PROTO ((Side *side, Unit *unit));
  176. extern void assign_to_offense_support PROTO ((Side *side, Unit *unit));
  177. extern int type_can_build_attackers PROTO ((Side *side, int u));
  178. extern int mplayer_preferred_build_type PROTO ((Side *side, Unit *unit, int plantype));
  179. extern int select_by_weight PROTO ((int *arr, int numvals));
  180. extern int need_more_transportation PROTO ((Side *side));
  181. extern void assign_to_defense_support PROTO ((Side *side, Unit *unit));
  182. extern int mplayer_guide_explorer PROTO ((Side *side, Unit *unit));
  183. extern int build_base_for_self PROTO ((Side *side, Unit *unit));
  184. extern int build_base_for_others PROTO ((Side *side, Unit *unit));
  185. extern int build_depot_for_self PROTO ((Side *side, Unit *unit));
  186. extern void mplayer_react_to_action_result PROTO ((Side *side, Unit *unit, int rslt));
  187. extern void mplayer_react_to_task_result PROTO ((Side *side, Unit *unit, Task *task, int rslt));
  188. extern void change_to_adjacent_theater PROTO ((Side *side, Unit *unit));
  189. extern int desired_direction_impassable PROTO ((Unit *unit, int x, int y));
  190. extern int could_be_ferried PROTO ((Unit *unit, int x, int y));
  191. extern int carryable PROTO ((int u));
  192. extern int accelerable PROTO ((int u));
  193. extern int blocked_by_enemy PROTO ((Unit *unit, int x, int y));
  194. extern void attack_blockage PROTO ((Side *side, Unit *unit, int x, int y));
  195. extern void mplayer_finish_movement PROTO ((Side *side));
  196. extern Unit *search_for_available_transport PROTO ((Unit *unit));
  197. extern void rethink_plan PROTO ((Unit *unit));
  198. extern int enemy_close_by PROTO ((Side *side, Unit *unit, int dist, int *xp, int *yp));
  199. extern void mplayer_receive_message PROTO ((Side *side, Side *sender, char *str));
  200. extern char *mplayer_at_desig PROTO ((Side *side, int x, int y));
  201. extern int mplayer_theater_at PROTO ((Side *side, int x, int y));
  202. extern void mplayer_write_state PROTO ((FILE *fp, Side *side));
  203.  
  204. extern void mplayer_init_shared PROTO ((void));
  205. extern int basic_worth PROTO ((int u));
  206. extern int offensive_worth PROTO ((int u));
  207. extern int basic_hit_worth PROTO ((int u, int e));
  208. extern int basic_capture_worth PROTO ((int u, int e));
  209. extern int unit_strength PROTO ((int u));
  210. extern void display_assessment PROTO ((void));
  211. extern void mplayer_react_to_unit_loss PROTO ((Side *side, Unit *unit));
  212. extern int is_base_for PROTO ((int u1, int u2));
  213. extern int is_carrier_for PROTO ((int u1, int u2));
  214. extern void set_u_is_base PROTO ((int u, int n));
  215. extern void set_u_is_transport PROTO ((int u, int n));
  216. extern void set_u_is_carrier PROTO ((int u, int n));
  217. extern void set_u_is_base_builder PROTO ((int u, int n));
  218. extern void set_u_can_make PROTO ((int u, int n));
  219. extern void set_u_can_capture PROTO ((int u, int n));
  220. extern void set_u_bw PROTO ((int u, int n));
  221. extern void set_t_fraction PROTO ((int t, int n));
  222. extern void set_uu_bhw PROTO ((int u1, int u2, int v));
  223. extern void set_uu_bcw PROTO ((int u1, int u2, int v));
  224.